package co.edu.usbcali.egrapico.logica;

/**
 * Clase para la traducci�n de la representaci�n de un
 * <Code>Identificador</Code> (variable, par�metro o nombre) desde <I>GraPiCO
 * Textual</I> hacia <I>C�lculo PiCO</I>. <P> Recibe en <I>GraPiCO Textual</I>:
 * <P> <Blockquote><Pre>   (x-y)Imag.ext~Nombre_Identificador </Pre></Blockquote>
 * <P> Traducci�n a <I>C�lculo PiCO</I>: <P> <Blockquote><Pre>   Nombre_Identificador
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005.
 */
public class Identifier {

    // Variable para almacenar el Identificador representado en c�lculo PiCO.
    String identifierPico = "";
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de clase
     * <Code>Identifier</Code>.<P> Toma un
     * <Code>Identificador</Code> representado en <I>GraPiCO Textual</I> y
     * separa la parte de la expresi�n que hace referencia a la representaci�n
     * f�sica del
     * <Code>Identificador</Code>, con el fin de obtener solo el nombre de este
     * usando el s�mbolo de sincronizaci�n "~".<P> Registra el nombre del
     * <Code>Identificador</Code> seg�n el valor de identifierType, en la tabla
     * correspondiente, para el <I>An�lisis Sem�ntico</I>.
     *
     * @param identifierGraPicoT Expresi�n equivalente a la representaci�n de un
     * identificador en <I>GraPiCO Textual</I>.
     * @param identifierType Tipo de identificador a traducir. Puede ser: <Blockquote><Pre>
     *                             "V" - lista de variables.
     *                             "N" - lista de nombres.
     *                             "P" - lista de par�metros.
     * </Pre></Blockquote>
     * @param nameProcess Nombre o lista de nombres de los procesos que se est�n
     * traduciendo.
     */
    public Identifier(String identifierGraPicoT, String identifierType, String nameProcess) {

        // Se obtiene proceso o lista de procesos.
        nameCurrentProcess = nameProcess;

        // Se obtiene el nombre del identificador.
        identifierPico = identifierGraPicoT.substring(identifierGraPicoT.indexOf("~") + 1);
        if (identifierType == "N") {
            SemanticAnalizer.PutDefinedMethods(identifierPico, nameCurrentProcess);
        } else {
            if ((identifierType == "P") || (identifierType == "V")) {
                // Se verifica que corresponda a un identificador no num�rico
                if (Character.isLetter(identifierPico.charAt(0))) {
                    SemanticAnalizer.PutDefinedIdentifiers(nameProcess, identifierPico, identifierType);
                }
            }
        }
    }

    /**
     * M�todo generador de la traducci�n de un
     * <Code>Identificador</Code>. <P> Devuelve un
     * <Code>Identificador</Code> expresado en <I>C�lculo PiCO</I>
     *
     * @return el
     * <Code>Identificador</Code> traducido a <I>C�lculo PiCO</I>.
     */
    public String traslate() {
        return identifierPico;
    }
}